/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package estsapp.utiles.modeloTabla;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Diego
 */
public abstract class ModeloTabla extends AbstractTableModel {

    private List listaElementos;
    public static List<String> columnNames;
    private boolean editable = false;

    public ModeloTabla(String... columnames) {
        columnNames = new ArrayList<>();
        columnNames.addAll(Arrays.asList(columnames));
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return editable;
    }

    public void setCellEditable(boolean edit) {
        editable = edit;
    }

    public void setListaElementos(List nuevaLista) {
        listaElementos = nuevaLista;
        fireTableDataChanged();
    }

    public void setListaElementosSinRepetir(List nuevaLista, List listaVieja) {
        for (Object listavieja : listaVieja) {
            for (Object listanueva : nuevaLista) {
                if (listavieja == listanueva) {
                    nuevaLista.remove(listanueva);
                }
            }

        }

        listaElementos = nuevaLista;
        fireTableDataChanged();
    }

    public List getListaElementos() {
        if (listaElementos == null) {
            listaElementos = new ArrayList();
        }
        return listaElementos;
    }

    @Override
    public int getRowCount() {
        if (listaElementos != null) {
            return listaElementos.size();
        } else {
            return 0;
        }
    }

    @Override
    public int getColumnCount() {
        return columnNames.size();
    }

    @Override
    public abstract Object getValueAt(int rowIndex, int columnIndex);

    @Override
    public String getColumnName(int column) {
        return columnNames.get(column);
    }

    public void addRow(Object newObject) {
        if (listaElementos == null) {
            listaElementos = new ArrayList();
        }
        listaElementos.add(newObject);
        fireTableDataChanged();
    }

    public void addAllRow(List nuevaLista) {
        if (listaElementos == null) {
            listaElementos = new ArrayList();
        }
        listaElementos.addAll(nuevaLista);
        fireTableDataChanged();
    }

    public Object getRow(int rowIndex) {
        return listaElementos.get(rowIndex);
    }

    public void clear() {

        listaElementos = null;
        fireTableDataChanged();
    }

    public void removeRow(int rowIndex) {
        listaElementos.remove(rowIndex);
        fireTableDataChanged();
    }

    public void removeElement(Object obj) {
        for (int i = 0; i < listaElementos.size(); i++) {
            if (listaElementos.get(i).equals(obj) && listaElementos.get(i).getClass().equals(obj.getClass())) {
                listaElementos.remove(i);
            }
        }
        fireTableDataChanged();
    }
}
